{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# StackingClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "An ensemble-learning meta-classifier for stacking."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> from mlxtend.classifier import StackingClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Overview"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Stacking is an ensemble learning technique to combine multiple classification models via a meta-classifier. The individual classification models are trained based on the complete training set; then, the meta-classifier is fitted based on the outputs -- meta-features -- of the individual classification models in the ensemble.\n",
    "The meta-classifier can either be trained on the predicted class labels or probabilities from the ensemble."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](./StackingClassifier_files/stackingclassification_overview.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The algorithm can be summarized as follows (source: [1]):\n",
    "    \n",
    "![](./StackingClassifier_files/stacking_algorithm.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Please note that this type of Stacking is prone to overfitting due to information leakage. The related [StackingCVClassifier.md](StackingCVClassifier.md) does not derive the predictions for the 2nd-level classifier from the same datast that was used for training the level-1 classifiers and is recommended instead.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### References\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- [1] Tang, J., S. Alelyani, and H. Liu. \"[Data Classification: Algorithms and Applications.](https://books.google.com/books?id=nwQZCwAAQBAJ&lpg=PA500&dq=stacking%20classifier%20subsets&pg=PA499#v=onepage&q&f=false)\" Data Mining and Knowledge Discovery Series, CRC Press (2015): pp. 498-500.\n",
    "- [2] Wolpert, David H. \"[Stacked generalization.](http://www.sciencedirect.com/science/article/pii/S0893608005800231)\" Neural networks 5.2 (1992): 241-259."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 1 - Simple Stacked Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "\n",
    "iris = datasets.load_iris()\n",
    "X, y = iris.data[:, 1:3], iris.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3-fold cross validation:\n",
      "\n",
      "Accuracy: 0.91 (+/- 0.01) [KNN]\n",
      "Accuracy: 0.93 (+/- 0.05) [Random Forest]\n",
      "Accuracy: 0.92 (+/- 0.03) [Naive Bayes]\n",
      "Accuracy: 0.95 (+/- 0.03) [StackingClassifier]\n"
     ]
    }
   ],
   "source": [
    "from sklearn import model_selection\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB \n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from mlxtend.classifier import StackingClassifier\n",
    "import numpy as np\n",
    "import warnings\n",
    "\n",
    "warnings.simplefilter('ignore')\n",
    "\n",
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=1)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "sclf = StackingClassifier(classifiers=[clf1, clf2, clf3], \n",
    "                          meta_classifier=lr)\n",
    "\n",
    "print('3-fold cross validation:\\n')\n",
    "\n",
    "for clf, label in zip([clf1, clf2, clf3, sclf], \n",
    "                      ['KNN', \n",
    "                       'Random Forest', \n",
    "                       'Naive Bayes',\n",
    "                       'StackingClassifier']):\n",
    "\n",
    "    scores = model_selection.cross_val_score(clf, X, y, \n",
    "                                              cv=3, scoring='accuracy')\n",
    "    print(\"Accuracy: %0.2f (+/- %0.2f) [%s]\" \n",
    "          % (scores.mean(), scores.std(), label))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from mlxtend.plotting import plot_decision_regions\n",
    "import matplotlib.gridspec as gridspec\n",
    "import itertools\n",
    "\n",
    "gs = gridspec.GridSpec(2, 2)\n",
    "\n",
    "fig = plt.figure(figsize=(10,8))\n",
    "\n",
    "for clf, lab, grd in zip([clf1, clf2, clf3, sclf], \n",
    "                         ['KNN', \n",
    "                          'Random Forest', \n",
    "                          'Naive Bayes',\n",
    "                          'StackingClassifier'],\n",
    "                          itertools.product([0, 1], repeat=2)):\n",
    "\n",
    "    clf.fit(X, y)\n",
    "    ax = plt.subplot(gs[grd[0], grd[1]])\n",
    "    fig = plot_decision_regions(X=X, y=y, clf=clf)\n",
    "    plt.title(lab)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 2 - Using Probabilities as Meta-Features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alternatively, the class-probabilities of the first-level classifiers can be used to train the meta-classifier (2nd-level classifier) by setting `use_probas=True`. If `average_probas=True`, the probabilities of the level-1 classifiers are averaged, if `average_probas=False`, the probabilities are stacked (recommended). For example, in a 3-class setting with 2 level-1 classifiers, these classifiers may make the following \"probability\" predictions for 1 training sample:\n",
    "\n",
    "- classifier 1: [0.2, 0.5, 0.3]\n",
    "- classifier 2: [0.3, 0.4, 0.4]\n",
    "\n",
    "If `average_probas=True`, the meta-features would be:\n",
    "\n",
    "- [0.25, 0.45, 0.35]\n",
    "\n",
    "In contrast, using `average_probas=False` results in k features where, k = [n_classes * n_classifiers], by stacking these level-1 probabilities:\n",
    "\n",
    "- [0.2, 0.5, 0.3, 0.3, 0.4, 0.4]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3-fold cross validation:\n",
      "\n",
      "Accuracy: 0.91 (+/- 0.01) [KNN]\n",
      "Accuracy: 0.93 (+/- 0.05) [Random Forest]\n",
      "Accuracy: 0.92 (+/- 0.03) [Naive Bayes]\n",
      "Accuracy: 0.94 (+/- 0.03) [StackingClassifier]\n"
     ]
    }
   ],
   "source": [
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=1)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],\n",
    "                          use_probas=True,\n",
    "                          average_probas=False,\n",
    "                          meta_classifier=lr)\n",
    "\n",
    "print('3-fold cross validation:\\n')\n",
    "\n",
    "for clf, label in zip([clf1, clf2, clf3, sclf], \n",
    "                      ['KNN', \n",
    "                       'Random Forest', \n",
    "                       'Naive Bayes',\n",
    "                       'StackingClassifier']):\n",
    "\n",
    "    scores = model_selection.cross_val_score(clf, X, y, \n",
    "                                              cv=3, scoring='accuracy')\n",
    "    print(\"Accuracy: %0.2f (+/- %0.2f) [%s]\" \n",
    "          % (scores.mean(), scores.std(), label))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 3 - Stacked Classification and GridSearch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The stack allows tuning hyper parameters of the base and meta models! A full list of tunable parameters can be obtained via `estimator.get_params().keys()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.667 +/- 0.00 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.927 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.920 +/- 0.03 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.933 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.940 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "Best parameters: {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "Accuracy: 0.94\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB \n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from mlxtend.classifier import StackingClassifier\n",
    "\n",
    "# Initializing models\n",
    "\n",
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=1)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "sclf = StackingClassifier(classifiers=[clf1, clf2, clf3], \n",
    "                          meta_classifier=lr)\n",
    "\n",
    "params = {'kneighborsclassifier__n_neighbors': [1, 5],\n",
    "          'randomforestclassifier__n_estimators': [10, 50],\n",
    "          'meta_classifier__C': [0.1, 10.0]}\n",
    "\n",
    "grid = GridSearchCV(estimator=sclf, \n",
    "                    param_grid=params, \n",
    "                    cv=5,\n",
    "                    refit=True)\n",
    "grid.fit(X, y)\n",
    "\n",
    "cv_keys = ('mean_test_score', 'std_test_score', 'params')\n",
    "\n",
    "for r, _ in enumerate(grid.cv_results_['mean_test_score']):\n",
    "    print(\"%0.3f +/- %0.2f %r\"\n",
    "          % (grid.cv_results_[cv_keys[0]][r],\n",
    "             grid.cv_results_[cv_keys[1]][r] / 2.0,\n",
    "             grid.cv_results_[cv_keys[2]][r]))\n",
    "\n",
    "print('Best parameters: %s' % grid.best_params_)\n",
    "print('Accuracy: %.2f' % grid.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In case we are planning to use a regression algorithm multiple times, all we need to do is to add an additional number suffix in the parameter grid as shown below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.907 +/- 0.03 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.920 +/- 0.03 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.927 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.920 +/- 0.03 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.927 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.920 +/- 0.03 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}\n",
      "0.667 +/- 0.00 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}\n",
      "0.933 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}\n",
      "0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "Best parameters: {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}\n",
      "Accuracy: 0.94\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "# Initializing models\n",
    "\n",
    "clf1 = KNeighborsClassifier(n_neighbors=1)\n",
    "clf2 = RandomForestClassifier(random_state=1)\n",
    "clf3 = GaussianNB()\n",
    "lr = LogisticRegression()\n",
    "sclf = StackingClassifier(classifiers=[clf1, clf1, clf2, clf3], \n",
    "                          meta_classifier=lr)\n",
    "\n",
    "params = {'kneighborsclassifier-1__n_neighbors': [1, 5],\n",
    "          'kneighborsclassifier-2__n_neighbors': [1, 5],\n",
    "          'randomforestclassifier__n_estimators': [10, 50],\n",
    "          'meta_classifier__C': [0.1, 10.0]}\n",
    "\n",
    "grid = GridSearchCV(estimator=sclf, \n",
    "                    param_grid=params, \n",
    "                    cv=5,\n",
    "                    refit=True)\n",
    "grid.fit(X, y)\n",
    "\n",
    "cv_keys = ('mean_test_score', 'std_test_score', 'params')\n",
    "\n",
    "for r, _ in enumerate(grid.cv_results_['mean_test_score']):\n",
    "    print(\"%0.3f +/- %0.2f %r\"\n",
    "          % (grid.cv_results_[cv_keys[0]][r],\n",
    "             grid.cv_results_[cv_keys[1]][r] / 2.0,\n",
    "             grid.cv_results_[cv_keys[2]][r]))\n",
    "\n",
    "print('Best parameters: %s' % grid.best_params_)\n",
    "print('Accuracy: %.2f' % grid.best_score_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note**\n",
    "\n",
    "The `StackingClassifier` also enables grid search over the `classifiers` argument. When there are level-mixed hyperparameters, GridSearchCV will try to replace hyperparameters in a top-down order, i.e., classifers -> single base classifier -> classifier hyperparameter. For instance,  given a hyperparameter grid such as\n",
    "\n",
    "    params = {'randomforestclassifier__n_estimators': [1, 100],\n",
    "    'classifiers': [(clf1, clf1, clf1), (clf2, clf3)]}\n",
    "    \n",
    "it will first use the instance settings of either (clf1, clf1, clf1) or (clf2, clf3). Then it will replace the `'n_estimators'` settings for a matching classifier based on `'randomforestclassifier__n_estimators': [1, 100]`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 4 - Stacking of Classifiers that Operate on Different Feature Subsets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The different level-1 classifiers can be fit to different subsets of features in the training dataset. The following example illustrates how this can be done on a technical level using scikit-learn pipelines and the `ColumnSelector`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "StackingClassifier(average_probas=False,\n",
       "          classifiers=[Pipeline(memory=None,\n",
       "     steps=[('columnselector', ColumnSelector(cols=(0, 2), drop_axis=False)), ('logisticregression', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None,...nalty='l2', random_state=None, solver='warn',\n",
       "          tol=0.0001, verbose=0, warm_start=False))])],\n",
       "          drop_last_proba=False,\n",
       "          meta_classifier=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='warn',\n",
       "          tol=0.0001, verbose=0, warm_start=False),\n",
       "          store_train_meta_features=False, use_clones=True,\n",
       "          use_features_in_secondary=False, use_probas=False, verbose=0)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from mlxtend.classifier import StackingClassifier\n",
    "from mlxtend.feature_selection import ColumnSelector\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "iris = load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "\n",
    "pipe1 = make_pipeline(ColumnSelector(cols=(0, 2)),\n",
    "                      LogisticRegression())\n",
    "pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)),\n",
    "                      LogisticRegression())\n",
    "\n",
    "sclf = StackingClassifier(classifiers=[pipe1, pipe2], \n",
    "                          meta_classifier=LogisticRegression())\n",
    "\n",
    "sclf.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "## StackingClassifier\n",
      "\n",
      "*StackingClassifier(classifiers, meta_classifier, use_probas=False, drop_last_proba=False, average_probas=False, verbose=0, use_features_in_secondary=False, store_train_meta_features=False, use_clones=True)*\n",
      "\n",
      "A Stacking classifier for scikit-learn estimators for classification.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `classifiers` : array-like, shape = [n_classifiers]\n",
      "\n",
      "    A list of classifiers.\n",
      "    Invoking the `fit` method on the `StackingClassifer` will fit clones\n",
      "    of these original classifiers that will\n",
      "    be stored in the class attribute\n",
      "    `self.clfs_`.\n",
      "\n",
      "- `meta_classifier` : object\n",
      "\n",
      "    The meta-classifier to be fitted on the ensemble of\n",
      "    classifiers\n",
      "\n",
      "- `use_probas` : bool (default: False)\n",
      "\n",
      "    If True, trains meta-classifier based on predicted probabilities\n",
      "    instead of class labels.\n",
      "\n",
      "- `drop_last_proba` : bool (default: False)\n",
      "\n",
      "    Drops the last \"probability\" column in the feature set since if `True`,\n",
      "    because it is redundant:\n",
      "    p(y_c) = 1 - p(y_1) + p(y_2) + ... + p(y_{c-1}).\n",
      "    This can be useful for meta-classifiers that are sensitive to\n",
      "    perfectly collinear features. Only relevant if `use_probas=True`.\n",
      "\n",
      "- `average_probas` : bool (default: False)\n",
      "\n",
      "    Averages the probabilities as meta features if `True`.\n",
      "    Only relevant if `use_probas=True`.\n",
      "\n",
      "- `verbose` : int, optional (default=0)\n",
      "\n",
      "    Controls the verbosity of the building process.\n",
      "    - `verbose=0` (default): Prints nothing\n",
      "    - `verbose=1`: Prints the number & name of the regressor being fitted\n",
      "    - `verbose=2`: Prints info about the parameters of the\n",
      "    regressor being fitted\n",
      "    - `verbose>2`: Changes `verbose` param of the underlying regressor to\n",
      "    self.verbose - 2\n",
      "\n",
      "- `use_features_in_secondary` : bool (default: False)\n",
      "\n",
      "    If True, the meta-classifier will be trained both on the predictions\n",
      "    of the original classifiers and the original dataset.\n",
      "    If False, the meta-classifier will be trained only on the predictions\n",
      "    of the original classifiers.\n",
      "\n",
      "- `store_train_meta_features` : bool (default: False)\n",
      "\n",
      "    If True, the meta-features computed from the training data used\n",
      "    for fitting the meta-classifier stored in the\n",
      "    `self.train_meta_features_` array, which can be\n",
      "    accessed after calling `fit`.\n",
      "\n",
      "- `use_clones` : bool (default: True)\n",
      "\n",
      "    Clones the classifiers for stacking classification if True (default)\n",
      "    or else uses the original ones, which will be refitted on the dataset\n",
      "    upon calling the `fit` method. Hence, if use_clones=True, the original\n",
      "    input classifiers will remain unmodified upon using the\n",
      "    StackingClassifier's `fit` method.\n",
      "    Setting `use_clones=False` is\n",
      "    recommended if you are working with estimators that are supporting\n",
      "    the scikit-learn fit/predict API interface but are not compatible\n",
      "    to scikit-learn's `clone` function.\n",
      "\n",
      "**Attributes**\n",
      "\n",
      "- `clfs_` : list, shape=[n_classifiers]\n",
      "\n",
      "    Fitted classifiers (clones of the original classifiers)\n",
      "\n",
      "- `meta_clf_` : estimator\n",
      "\n",
      "    Fitted meta-classifier (clone of the original meta-estimator)\n",
      "\n",
      "- `train_meta_features` : numpy array, shape = [n_samples, n_classifiers]\n",
      "\n",
      "    meta-features for training data, where n_samples is the\n",
      "    number of samples\n",
      "    in training data and n_classifiers is the number of classfiers.\n",
      "\n",
      "**Examples**\n",
      "\n",
      "For usage examples, please see\n",
      "    [http://rasbt.github.io/mlxtend/user_guide/classifier/StackingClassifier/](http://rasbt.github.io/mlxtend/user_guide/classifier/StackingClassifier/)\n",
      "\n",
      "### Methods\n",
      "\n",
      "<hr>\n",
      "\n",
      "*fit(X, y, sample_weight=None)*\n",
      "\n",
      "Fit ensemble classifers and the meta-classifier.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : {array-like, sparse matrix}, shape = [n_samples, n_features]\n",
      "\n",
      "    Training vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "- `y` : array-like, shape = [n_samples] or [n_samples, n_outputs]\n",
      "\n",
      "    Target values.\n",
      "\n",
      "- `sample_weight` : array-like, shape = [n_samples], optional\n",
      "\n",
      "    Sample weights passed as sample_weights to each regressor\n",
      "    in the regressors list as well as the meta_regressor.\n",
      "    Raises error if some regressor does not support\n",
      "    sample_weight in the fit() method.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `self` : object\n",
      "\n",
      "\n",
      "<hr>\n",
      "\n",
      "*fit_transform(X, y=None, **fit_params)*\n",
      "\n",
      "Fit to data, then transform it.\n",
      "\n",
      "Fits transformer to X and y with optional parameters fit_params\n",
      "and returns a transformed version of X.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : numpy array of shape [n_samples, n_features]\n",
      "\n",
      "    Training set.\n",
      "\n",
      "\n",
      "- `y` : numpy array of shape [n_samples]\n",
      "\n",
      "    Target values.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `X_new` : numpy array of shape [n_samples, n_features_new]\n",
      "\n",
      "    Transformed array.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*get_params(deep=True)*\n",
      "\n",
      "Return estimator parameter names for GridSearch support.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*predict(X)*\n",
      "\n",
      "Predict target values for X.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : {array-like, sparse matrix}, shape = [n_samples, n_features]\n",
      "\n",
      "    Training vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `labels` : array-like, shape = [n_samples] or [n_samples, n_outputs]\n",
      "\n",
      "    Predicted class labels.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*predict_meta_features(X)*\n",
      "\n",
      "Get meta-features of test-data.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : numpy array, shape = [n_samples, n_features]\n",
      "\n",
      "    Test vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `meta-features` : numpy array, shape = [n_samples, n_classifiers]\n",
      "\n",
      "    Returns the meta-features for test data.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*predict_proba(X)*\n",
      "\n",
      "Predict class probabilities for X.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : {array-like, sparse matrix}, shape = [n_samples, n_features]\n",
      "\n",
      "    Training vectors, where n_samples is the number of samples and\n",
      "    n_features is the number of features.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `proba` : array-like, shape = [n_samples, n_classes] or a list of                 n_outputs of such arrays if n_outputs > 1.\n",
      "\n",
      "    Probability for each class per sample.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*score(X, y, sample_weight=None)*\n",
      "\n",
      "Returns the mean accuracy on the given test data and labels.\n",
      "\n",
      "In multi-label classification, this is the subset accuracy\n",
      "which is a harsh metric since you require for each sample that\n",
      "each label set be correctly predicted.\n",
      "\n",
      "**Parameters**\n",
      "\n",
      "- `X` : array-like, shape = (n_samples, n_features)\n",
      "\n",
      "    Test samples.\n",
      "\n",
      "\n",
      "- `y` : array-like, shape = (n_samples) or (n_samples, n_outputs)\n",
      "\n",
      "    True labels for X.\n",
      "\n",
      "\n",
      "- `sample_weight` : array-like, shape = [n_samples], optional\n",
      "\n",
      "    Sample weights.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "- `score` : float\n",
      "\n",
      "    Mean accuracy of self.predict(X) wrt. y.\n",
      "\n",
      "<hr>\n",
      "\n",
      "*set_params(**params)*\n",
      "\n",
      "Set the parameters of this estimator.\n",
      "\n",
      "Valid parameter keys can be listed with ``get_params()``.\n",
      "\n",
      "**Returns**\n",
      "\n",
      "self\n",
      "\n",
      "### Properties\n",
      "\n",
      "<hr>\n",
      "\n",
      "*named_classifiers*\n",
      "\n",
      "None\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open('../../api_modules/mlxtend.classifier/StackingClassifier.md', 'r') as f:\n",
    "    print(f.read())"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
